λ kubectl evict
Evictする
つまり、
Pod を安全に削除する
kubectl delete podと異なり、PDBを尊重して削除可能かどうかをチェックする
gpt-5.icon
Eviction APIを直接呼び出す
特にノードメンテナンスやスケジューリング制御時に利用されます。
🧩 基本概要
$ kubectl evict POD_NAME --namespace NAMESPACE --force --grace-period=秒数
kubectl delete pod との違い
table:_
項目 kubectl delete pod kubectl evict
主目的 Pod を即時削除 Pod を安全に退避
PDB を考慮する ❌ 無視する ✅ 尊重する
再スケジュール スケジューラーに任せる(手動の場合は再作成されないことも) 通常 ReplicaSet/Deployment により自動再スケジュール
利用場面 緊急削除や強制削除 ノードメンテナンスやローリング再起動など
🧩 内部動作
kubectl evict は以下のような流れで動きます:
1. Eviction オブジェクトを API サーバーに送信する(policy/v1 の Eviction API)。
2. Kubernetes は該当 Pod の PDB をチェック。
3. 許可される場合 → Pod を削除(delete と同じく graceful termination)。
4. ReplicaSet / Deployment / StatefulSet などのコントローラーが新しい Pod を別ノードに作成。
もし PDB により「許可されない」場合(例: 最小稼働数を下回る)、kubectl evict は以下のようなエラーを返します:
code:_
Error from server (TooManyRequests): Cannot evict pod as it would violate the pod's disruption budget.
⚙️ よく使うオプション
table:_
オプション 説明
--namespace 対象 Pod の名前空間
--grace-period 優雅な終了時間(秒)。コンテナが終了シグナルを受けてから強制 kill までの猶予時間
--force 一部制限を無視して強制退避(ただし PDB は無視されない)
--dry-run=client 実際には退避せず、API リクエスト内容を確認する
🧰 使用例
1️⃣ 単一 Pod を退避
code:bash
kubectl evict my-pod --namespace=default
2️⃣ PDB を考慮した安全なノード drain
kubectl drain は内部で kubectl evict を呼び出します:
code:bash
kubectl drain my-node --ignore-daemonsets --delete-emptydir-data
これは、ノード上の Pod をすべて安全に退避(PDB考慮)する仕組みです。
🧩 Eviction API の YAML 例
手動で Eviction リクエストを作ることもできます:
code:yaml
apiVersion: policy/v1
kind: Eviction
metadata:
name: my-pod
namespace: default
deleteOptions:
gracePeriodSeconds: 10
これを送信すると同等の退避が行われます:
code:bash
kubectl create -f eviction.yaml